﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using System.Web.Security;
using GameSchool.Models;
using GameSchool.Models.Common;
using GameSchool.Repository.Repositories.RuGameSchool;
using GameSchool.Repository;

namespace GameSchool.Controllers
{
	/// <summary>
	/// AccountController sér um alla virkni í sambandi við inn- og útskráningar kerfisins. 
	/// </summary>  
	
	public class AccountController : Controller
	{
        IGameSchoolRepository m_data = RepositoryMaster.CurrentRepository;

		// GET: /Account/LogOn
		public ActionResult LogOn()
		{
			return View();
		}

		// POST: /Account/LogOn
		[HttpPost]
		public ActionResult LogOn(LogOnModel model, string returnUrl)
		{
			if (ModelState.IsValid)
			{
				if (Membership.ValidateUser(model.UserName, model.Password))
				{
					FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
					if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
						&& !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
					{
						return Redirect(returnUrl);
					}
					else
					{
						return RedirectToAction("Index", "Home");
					}
				}
				else
				{
					ModelState.AddModelError("", "Rangt notendanafn eða lykilorð var slegið inn.");
				}
			}

			// If we got this far, something failed, redisplay form
			return View(model);
		}

		// GET: /Account/LogOff
		public ActionResult LogOff()
		{
			FormsAuthentication.SignOut();
			return RedirectToAction("Index", "Home");
		}

		// GET: /Account/Register
		public ActionResult Register()
		{		
			return View();
		}

		// POST: /Account/Register
		[HttpPost]
        public ActionResult Register(RegisterModel model)
		{
			if (ModelState.IsValid)
			{
				// Attempt to register the user
				MembershipCreateStatus createStatus;
				Membership.CreateUser(model.UserName, model.Password, model.Email, null, null, true, null, out createStatus);

				if (createStatus == MembershipCreateStatus.Success)
				{
                    Person newPerson = new Person();		//Hér er bætt við skráningu í Persons klasann okkar.
                    newPerson.Username = model.UserName;
                    newPerson.Fullname = model.Fullname;
                    newPerson.Address = model.Address;
                    newPerson.ZipCode = model.ZipCode;

                    newPerson.PhoneNumber = model.Phonenumber;
                    newPerson.Ssn = model.Ssn;

                    m_data.Persons.Add(newPerson);

                    m_data.SaveChanges();

                    // Allir eru skráðir sem stúdentar til að byrja með. 
                    // Admin sér svo um það að breyta notenda í kennara ef þess er þörf.
                    Roles.AddUserToRole(model.UserName, "Students");

                    // Ef notandi er þegar skráður inn þá viljum ekki setja nýja aðganginn sem innskráða notandann.
                    if (!(System.Web.HttpContext.Current.User.Identity.IsAuthenticated))
                    {
                        FormsAuthentication.SetAuthCookie(model.UserName, false /* createPersistentCookie */);
                    }

					return RedirectToAction("Index", "Home");
				}
				else
				{
					ModelState.AddModelError("", ErrorCodeToString(createStatus));
				}
			}
			// If we got this far, something failed, redisplay form
			return View(model);
		}

		// GET: /Account/ChangePassword
		[Authorize]
		public ActionResult ChangePassword()
		{
			return View();
		}

		// POST: /Account/ChangePassword
		[Authorize]
		[HttpPost]
		public ActionResult ChangePassword(ChangePasswordModel model)
		{
			if (ModelState.IsValid)
			{
				// ChangePassword will throw an exception rather
				// than return false in certain failure scenarios.
				bool changePasswordSucceeded;
				try
				{
					MembershipUser currentUser = Membership.GetUser(User.Identity.Name, true /* userIsOnline */);
					changePasswordSucceeded = currentUser.ChangePassword(model.OldPassword, model.NewPassword);
				}
				catch (Exception)
				{
					changePasswordSucceeded = false;
				}

				if (changePasswordSucceeded)
				{
					return RedirectToAction("ChangePasswordSuccess");
				}
				else
				{
					ModelState.AddModelError("", "The current password is incorrect or the new password is invalid.");
				}
			}
			// If we got this far, something failed, redisplay form
			return View(model);
		}

		// GET: /Account/ChangePasswordSuccess
		public ActionResult ChangePasswordSuccess()
		{
			return View();
		}

		#region Status Codes
		private static string ErrorCodeToString(MembershipCreateStatus createStatus)
		{
			// See http://go.microsoft.com/fwlink/?LinkID=177550 for
			// a full list of status codes.
			switch (createStatus)
			{
				case MembershipCreateStatus.DuplicateUserName:
					return "Notendanafnið sem þú valdir er nú þegar í notkun, vinsamlegast veldu annað.";

				case MembershipCreateStatus.DuplicateEmail:
					return "Notendanafn fyrir þetta tölvupóstfang er nú þegar til, Vinsamlegast sláðu inn annað tölvupóstfangfang.";

				case MembershipCreateStatus.InvalidPassword:
					return "Lykilorðið sem þú slóst inn í ógilt, vinsamlegast sláðu inn gilt lykilorð.";

				case MembershipCreateStatus.InvalidEmail:
					return "Tölvupóstfangið sem þú slóst inn er ógilt, vinsamlegast sláðu inn gilt póstfang.";

				case MembershipCreateStatus.InvalidAnswer:
					return "Svarið sem þú slóst inn er rangt. Vinsamlegast reyndu aftur.";

				case MembershipCreateStatus.InvalidQuestion:
					return "Spurningin sem þú slóst inn er ógild. Vinsamlegast reyndu aftur.";

				case MembershipCreateStatus.InvalidUserName:
					return "Notendanafnið sem þú slóst inn er ógilt. Vinsamlegast reyndu aftur.";

				case MembershipCreateStatus.ProviderError:
					return "Innslátturinn skilaði villu. Vinsamlegast reyndu aftur. Ef þú færð fleiri vandamál þessu tengd viljum við benda þér á að hafa samband við tölvu- og tækniþjónustuna.";

				case MembershipCreateStatus.UserRejected:
					return "Ekki tókst að búa til notanda. Vinsamlegast reyndu aftur. Ef þú færð fleiri vandamál þessu tengd viljum við benda þér á að hafa samband við tölvu- og tækniþjónustuna.";

				default:
					return "Óþekkt villa átti sér stað. Vinsamlegast reyndu aftur. Ef þú færð fleiri vandamál þessu tengd viljum við benda þér á að hafa samband við tölvu- og tækniþjónustuna.";
			}
		}
		#endregion	
	}
}
